<!DOCTYPE html>
<html>
<head>
<title>JDBC</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
/* GitHub stylesheet for MarkdownPad (http://markdownpad.com) */
/* Author: Nicolas Hery - http://nicolashery.com */
/* Version: b13fe65ca28d2e568c6ed5d7f06581183df8f2ff */
/* Source: https://github.com/nicolahery/markdownpad-github */

/* RESET
=============================================================================*/

html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video {
  margin: 0;
  padding: 0;
  border: 0;
}

/* BODY
=============================================================================*/

body {
  font-family: Helvetica, arial, freesans, clean, sans-serif;
  font-size: 14px;
  line-height: 1.6;
  color: #333;
  background-color: #fff;
  padding: 20px;
  max-width: 960px;
  margin: 0 auto;
}

body>*:first-child {
  margin-top: 0 !important;
}

body>*:last-child {
  margin-bottom: 0 !important;
}

/* BLOCKS
=============================================================================*/

p, blockquote, ul, ol, dl, table, pre {
  margin: 15px 0;
}

/* HEADERS
=============================================================================*/

h1, h2, h3, h4, h5, h6 {
  margin: 20px 0 10px;
  padding: 0;
  font-weight: bold;
  -webkit-font-smoothing: antialiased;
}

h1 tt, h1 code, h2 tt, h2 code, h3 tt, h3 code, h4 tt, h4 code, h5 tt, h5 code, h6 tt, h6 code {
  font-size: inherit;
}

h1 {
  font-size: 28px;
  color: #000;
}

h2 {
  font-size: 24px;
  border-bottom: 1px solid #ccc;
  color: #000;
}

h3 {
  font-size: 18px;
}

h4 {
  font-size: 16px;
}

h5 {
  font-size: 14px;
}

h6 {
  color: #777;
  font-size: 14px;
}

body>h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h4:first-child, body>h5:first-child, body>h6:first-child {
  margin-top: 0;
  padding-top: 0;
}

a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 {
  margin-top: 0;
  padding-top: 0;
}

h1+p, h2+p, h3+p, h4+p, h5+p, h6+p {
  margin-top: 10px;
}

/* LINKS
=============================================================================*/

a {
  color: #4183C4;
  text-decoration: none;
}

a:hover {
  text-decoration: underline;
}

/* LISTS
=============================================================================*/

ul, ol {
  padding-left: 30px;
}

ul li > :first-child, 
ol li > :first-child, 
ul li ul:first-of-type, 
ol li ol:first-of-type, 
ul li ol:first-of-type, 
ol li ul:first-of-type {
  margin-top: 0px;
}

ul ul, ul ol, ol ol, ol ul {
  margin-bottom: 0;
}

dl {
  padding: 0;
}

dl dt {
  font-size: 14px;
  font-weight: bold;
  font-style: italic;
  padding: 0;
  margin: 15px 0 5px;
}

dl dt:first-child {
  padding: 0;
}

dl dt>:first-child {
  margin-top: 0px;
}

dl dt>:last-child {
  margin-bottom: 0px;
}

dl dd {
  margin: 0 0 15px;
  padding: 0 15px;
}

dl dd>:first-child {
  margin-top: 0px;
}

dl dd>:last-child {
  margin-bottom: 0px;
}

/* CODE
=============================================================================*/

pre, code, tt {
  font-size: 12px;
  font-family: Consolas, "Liberation Mono", Courier, monospace;
}

code, tt {
  margin: 0 0px;
  padding: 0px 0px;
  white-space: nowrap;
  border: 1px solid #eaeaea;
  background-color: #f8f8f8;
  border-radius: 3px;
}

pre>code {
  margin: 0;
  padding: 0;
  white-space: pre;
  border: none;
  background: transparent;
}

pre {
  background-color: #f8f8f8;
  border: 1px solid #ccc;
  font-size: 13px;
  line-height: 19px;
  overflow: auto;
  padding: 6px 10px;
  border-radius: 3px;
}

pre code, pre tt {
  background-color: transparent;
  border: none;
}

kbd {
    -moz-border-bottom-colors: none;
    -moz-border-left-colors: none;
    -moz-border-right-colors: none;
    -moz-border-top-colors: none;
    background-color: #DDDDDD;
    background-image: linear-gradient(#F1F1F1, #DDDDDD);
    background-repeat: repeat-x;
    border-color: #DDDDDD #CCCCCC #CCCCCC #DDDDDD;
    border-image: none;
    border-radius: 2px 2px 2px 2px;
    border-style: solid;
    border-width: 1px;
    font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
    line-height: 10px;
    padding: 1px 4px;
}

/* QUOTES
=============================================================================*/

blockquote {
  border-left: 4px solid #DDD;
  padding: 0 15px;
  color: #777;
}

blockquote>:first-child {
  margin-top: 0px;
}

blockquote>:last-child {
  margin-bottom: 0px;
}

/* HORIZONTAL RULES
=============================================================================*/

hr {
  clear: both;
  margin: 15px 0;
  height: 0px;
  overflow: hidden;
  border: none;
  background: transparent;
  border-bottom: 4px solid #ddd;
  padding: 0;
}

/* TABLES
=============================================================================*/

table th {
  font-weight: bold;
}

table th, table td {
  border: 1px solid #ccc;
  padding: 6px 13px;
}

table tr {
  border-top: 1px solid #ccc;
  background-color: #fff;
}

table tr:nth-child(2n) {
  background-color: #f8f8f8;
}

/* IMAGES
=============================================================================*/

img {
  max-width: 100%
}
</style>
<script type="text/javascript">
  document.addEventListener("DOMContentLoaded", function() {

    // 生成目录列表
    var div1 = document.createElement("div");
    div1.style.cssText = "clear:both";
    var outline = document.createElement("div");
    outline.setAttribute("id", "outline-list");
    outline.style.cssText = "border:solid 1px #ccc; background:#eee; min-width:200px;padding:4px 10px;";

    var ele_p = document.createElement("p");
    ele_p.style.cssText = "text-align: left; margin: 0;";
    outline.appendChild(ele_p);

    var ele_span = document.createElement("span");
    // ele_span.style.cssText = "float: left;";
    var ele_text=document.createTextNode("目录");
    ele_span.appendChild(ele_text);

    var ele_a = document.createElement("a");
    ele_a.appendChild(document.createTextNode("[+]"));
    ele_a.setAttribute("href", "#");
    ele_a.setAttribute("onclick", "javascript:return openct(this);");
    ele_a.setAttribute("title", "点击打开目录");

    ele_span.appendChild(ele_a);
    ele_p.appendChild(ele_span);

    var ele_ol = document.createElement("ol");
    ele_ol.style.cssText = "display:none;margin-left:14px;padding-left:14px;line-height:160%;";
    ele_ol.setAttribute("id", "outline_ol");
    outline.appendChild(ele_ol);
    var div1 = document.createElement("div");
    div1.style.cssText = "clear:both";

    document.body.insertBefore(outline, document.body.childNodes[0]);
    // 获取所有标题
    var headers = document.querySelectorAll('h1,h2,h3,h4,h5,h6');
    if (headers.length < 2)
      return;

    // -----
    var old_h = 0, ol_cnt = 0;
    // -----

    for (var i = 0; i < headers.length; i++) {

      var ele_ols = null;
      var ele_Current = ele_ol;
      // 找出它是H几，为后面前置空格准备
      var header = headers[i];
      header.setAttribute("id", "t" + i + header.tagName);
      var h = parseInt(header.tagName.substr(1), 10);

      // -----
      if (!old_h){
        old_h = h;

      }

      if (h > old_h) {

        ele_ols = document.createElement("ol");
        ele_Current = ele_ol;
        if(ele_Current && ol_cnt > 0){
          var temp = ol_cnt;
          while(temp > 0){
            ele_Current = ele_Current.lastChild;
            temp--;
          }
        }
        ele_Current.lastChild.appendChild(ele_ols);
        ol_cnt++;
      } else if (h < old_h && ol_cnt > 0) {

        if (h == 1) {
          while (ol_cnt > 0) {
            ol_cnt--;
          }
        } else {
          ele_ols = document.createElement("ol");
          ele_Current = ele_ol;
          if(ele_Current && ol_cnt > 0){
            var temp = ol_cnt;
            while(temp > 1){
              ele_Current = ele_Current.lastChild;
              temp--;
            }
          }
        // var ele_Parent = ele_Current.parentNode();
        //ele_Current.appendChild(ele_ols);
        ol_cnt--;

        }
      } else if (h == old_h && ol_cnt > 0) {

        ele_Current = ele_ol;
        if(ele_Current && ol_cnt > 0){
          var temp = ol_cnt;
          while(temp > 0){
            ele_Current = ele_Current.lastChild;
            temp--;
          }
        }
        ele_Current = ele_Current.lastChild;
      }
      if (h == 1) {
        while (ol_cnt > 0) {
          ol_cnt--;
        }
      }
      if (h < old_h && ol_cnt > 0 && h != 1){
        ele_li = document.createElement("li")
        ele_Current.lastChild.appendChild(ele_li);
        old_h = h;
        var a = document.createElement("a");
        // 为目录项设置链接
        a.setAttribute("href", "#t" + i + header.tagName);
        // 目录项文本前面放置对应的空格
        a.innerHTML = header.textContent;
        ele_li.appendChild(a);
        continue;
      }

      old_h = h;
      // -----
      if (ele_ols){
        ele_li = document.createElement("li")
        ele_ols.appendChild(ele_li); 
      } else {
        ele_li = document.createElement("li")
        ele_Current.appendChild(ele_li);
      }
      var a = document.createElement("a");
      // 为目录项设置链接
      a.setAttribute("href", "#t" + i + header.tagName);
      // 目录项文本前面放置对应的空格
      a.innerHTML = header.textContent;
      ele_li.appendChild(a);
    }
    // -----
    while (ol_cnt > 0) {
      ol_cnt--;
    }
    // -----
    });
function openct(e) {
  if (e.innerHTML == '[+]') {
    // createTextNode
    e.setAttribute('title', '收起');
    e.innerHTML = '[-]';
    var element = document.getElementById("outline_ol");
    element.style.cssText = "margin-left:14px;padding-left:14px;line-height:160%;";
  } else {
    e.setAttribute('title', '展开');
    e.innerHTML = '[+]';
    var element = document.getElementById("outline_ol");
    element.style.cssText = "display:none;margin-left:14px;padding-left:14px;line-height:160%;";
  }
  e.blur();
  return false;
}
</script>
</head>
<body>
<h1>JDBC-day01</h1>
<ul>
<li>JDBC java数据库连接</li>
<li>
<p>JDBC是JAVA官司方提供的一套接口,用于连接并操作数据库不同的数据库厂商都提供了一套JDBC的实现类,并以JAR包形式发布,用于使我们的程序可以通过这套实现类来操作其数据库,这套jar称为&quot;驱动&quot;.</p>
</li>
<li>
<p>我们无需记住这些数据库提供商提供的JDBC实现类的名字,只要使用JDBC接口看待它们即可,以多态形式调用它们来操作数据库 </p>
</li>
</ul>
<h2>1.JDBC接口介绍</h2>
<ul>
<li>
<p>1): DriverManager</p>
<ul>
<li>DriverManager是实现类,用于加载数据库驱动,并与数据库连接,成功建立后产生Connection</li>
</ul>
</li>
<li>
<p>2): Connection接口</p>
<ul>
<li>表示与数据库的连接,负责管理事务,创建Statement实例</li>
</ul>
</li>
<li>
<p>3):Statement接口</p>
<ul>
<li>负责执行SQL语句</li>
</ul>
</li>
<li>
<p>4):ResultSet接口</p>
<ul>
<li>表示查询结果集</li>
</ul>
</li>
</ul>
<h2>2.数据库连接步骤</h2>
<ul>
<li>1):加载类库(驱动jar包)到JVM</li>
<li>2):通过DriverManager建立连接这里会加载jar包中JDBC实现类来与数据库建立连接</li>
<li>3):通过Connection创建Statement对象</li>
<li>4):通过Statement执行SQL语句</li>
<li>5):若执行的是DQL语句,则会得到查询结果集ResultSet,遍历该结果
 集得到查询内容</li>
<li>6):关闭连接</li>
</ul>
<h3>2.1)Class.forName(String className )加载驱动包</h3>
<ul>
<li>
<p>不同的数据库,驱动包路径不同,下面代码容易出现:ClassNotFoundException原因一般有两个:</p>
<ul>
<li>1:类路径写错了</li>
<li>
<p>2:项目没有导入驱动jar包(ojdbc)</p>
<pre><code>Class.forName(&quot;oracle.jdbc.driver.OracleDriver&quot;);
</code></pre>

</li>
</ul>
</li>
</ul>
<h3>2.2)Connection DriverManager.getConnection 加载驱动建立连接</h3>
<ul>
<li>
<p>使用DriverManger的静态方法getConnection该方法要求传入三个参数:</p>
<ul>
<li>
<p>1)数据库地址(不同数据库格式不同):地址:端口:SID</p>
</li>
<li>
<p>2)登录数据库时的用户名</p>
</li>
<li>
<p>3:密码</p>
</li>
</ul>
</li>
<li>
<p>oracle的格式: jdbc:oracle:thin:@url:port:sid</p>
<pre><code>Connection conn = DriverManager.getConnection(
            &quot;jdbc:oracle:thin:@172.86.30.150:1521:orcl&quot;,
            &quot;openlab&quot;,&quot;open123&quot;);
</code></pre>

</li>
</ul>
<h3>2.3)Statement createStatement()  创建Statement</h3>
<pre><code>    Statement state= conn.createStatement();
</code></pre>

<h3>2.4)执行SQL语句</h3>
<ul>
<li>执行不同种类的SQL语句有相应的方法：</li>
</ul>
<h4>2.4.1)int executeUpdate(String sql) 执行DML语句</h4>
<ul>
<li>
<p>专门用来执行DML语句的方法，返回值是一个整数用来表示执行了该DML语句后影响了
表中多少条数据。</p>
<pre><code>String sql = &quot;INSERT INTO userinfo_hjx &quot;
                + &quot;(id,username,password,email,nickname,account) &quot;
                + &quot;VALUES &quot;
                + &quot;(seq_userinfo_id_hjx.NEXTVAL, &quot;
                + &quot;'&quot;+ username+&quot;', &quot;
                + &quot;'&quot;+password +&quot;', &quot;
                + &quot;'&quot;+email+&quot;', &quot;
                + &quot;'&quot;+nickname+&quot;','&quot;+account+&quot;')&quot;;

int i = state.executeUpdate(sql);  --执行语句
</code></pre>

</li>
</ul>
<h4>2.4.2)ResultSet executeQuery（String sql) 执行DQL语句</h4>
<ul>
<li>
<p>专门用来指定DQL语句的方法，返回值为查询结果集</p>
</li>
<li>
<p>ResultSet 表示查询的结果集 ,遍历结果集的步骤为:</p>
<ul>
<li>
<p>1:先判断结果集是否还有下一条记录</p>
</li>
<li>
<p>2:若有,则可以获取该条记录各字段的值</p>
</li>
</ul>
</li>
<li>
<p>如此反复直到所有记录都被遍历完毕,</p>
</li>
<li>
<p>ResultSetMetaData getMetaData() 获取结果集中的元数据
	ResultSetMetaData rsmd = rs.getMetaData();</p>
</li>
<li>
<p>getColumnCount();获取结果集包含的字段数
	int i = rsmd.getColumnCount(); </p>
</li>
<li>
<p>遍历的相关方法:</p>
<ul>
<li>
<p>1) boolean next()该方法会让指针指向结果集下一条记录并且ResultSet表示该条记录,若返回值为false则表示没有记录了</p>
</li>
<li>
<p>2)一组getXXX(String colName)方法:</p>
<ul>
<li>获取字符串类型字段值用getString</li>
<li>获取整数用getInt</li>
<li>
<p>获取小数用getDouble等 </p>
<pre><code>ResultSet rs = state.executeQuery(sql);   --执行语句

while(rs.next()){                       --遍历结果集
    //获取ID
    int id = rs.getInt(&quot;id&quot;);
    String username = rs.getString(&quot;username&quot;);
    String password = rs.getString(&quot;password&quot;);
    String email = rs.getString(&quot;email&quot;);
    String nickname = rs.getString(&quot;nickname&quot;);
    double account = rs.getDouble(&quot;account&quot;);

    System.out.println(id+&quot;,&quot;+username+&quot;,&quot;+password+&quot;,&quot;+email+&quot;,&quot;+nickname+&quot;,&quot;+account);
}
</code></pre>

</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>2.4.3)boolean execute(String sql)  用来执行DDL语句</h4>
<ul>
<li>
<p>本语句什么SQL语句都可以指定行，但由于DML，DQL有专门的方法，所以该方法一般用来执行DDL语句。返回值为true时说明执行后有返回值，但是若执行不是DQL语句，其他类型语句执行后返回值都是false.</p>
<pre><code>String sql = &quot;CREATE TABLE userinfo_hjx( &quot;
                + &quot; id NUMBER(6), &quot;
                + &quot; username VARCHAR2(32), &quot;
                + &quot; password VARCHAR2(32), &quot;
                + &quot; email VARCHAR2(50), &quot;
                + &quot; nickname VARCHAR2(32), &quot;
                + &quot; account NUMBER(10,2) &quot;
                + &quot;)&quot;;
boolean b = state.execute(sql);         --执行语句
</code></pre>

</li>
</ul>
<h2>3.数据连接管理</h2>
<ul>
<li>由于数据库连接操作,经常使用,可以将其定义为一产专门用来进行数据库连接的静态方法
每次用只需调用该静态方法即可 </li>
<li>将地址配置信息写到 *.properties文件中(同Map相似:username=openlab)</li>
<li>用Properties类加载配置文件,获取初始化信息,</li>
<li>
<p>配置文件分:XML标签文件,行字符串,键值对,指针读</p>
<p>*.properties文件格式如图:
<img src="http://i.imgur.com/8gOJpBw.png" /></p>
</li>
</ul>
<h3>3.1)创建对象:Properties prop = new Properties() 用于加载配置文件</h3>
<h3>3.2)void load(InputStream inStream)  读取配置文件</h3>
<ul>
<li>
<p>该方法要求传入一个输入流</p>
<pre><code>Properties prop = new Properties()    //创建对象
prop.load(new FileInputStream(&quot;config.properties&quot;));  读取文件
</code></pre>

</li>
</ul>
<h3>3.3)String getProperty(String key) 获取读到的信息</h3>
<pre><code>        String driverName = prop.getProperty(&quot;drivername&quot;);
        String url = prop.getProperty(&quot;url&quot;);


        Class.forName(driverName);
        Connection conn = DriverManager.getConnection(url,username,password);
</code></pre>

<h1>JDBC-day02</h1>
<h2>1.预编译SQL语句</h2>
<ul>
<li>java.sql.Statement用来执行SQL语句,但是Statement只适合执行静态SQL语句,即:SQL语句中不含有拼接动态数据的地方.因为拼接SQL语句会带来SQL语句的复杂度提高,并且可能出现SQL注入攻击</li>
<li>java.sql.PreparedStatement是Statement的子类专门用来解决上述问题PS适合执行含有动态信息的SQL语句.其执行的是预编译SQL语句.</li>
</ul>
<h3>1)PreparedStatement prepareStatement(String sql) 创建对象</h3>
<ul>
<li>
<p>预编译SQL语句,特点:所有动态信息用 &quot;?&quot; 代替,注意只能代替值</p>
</li>
<li>
<p>由于使用PS不会将动态信息拼接到SQL语句中这样就不会出现由于拼接了动态信息可能导致改变语义的情况,所以使用PS不会出现SQL注入攻击的问题.</p>
</li>
<li>
<p>创建PS的同时将预编译SQL语句传入,Connection 就会将该SQL语句发送至数据库来生成执行计划,只是该执行计划还不能执行,因为缺少?对应的值</p>
<pre><code>String sql = &quot;INSERT INTO userinfo_hjx &quot;     //预编译SQL语句
            + &quot;(id,username,password) &quot;
            + &quot;VALUES &quot;
            + &quot;(seq_userinfo_id_hjx.NEXTVAL,?,'123456')&quot;;

PreparedStatement ps = conn.prepareStatement(sql);  //创建对象
</code></pre>

</li>
<li>
<p>向userinfo表中插入1000条数据,每次指定?的值以后执行executeUpdate只是将该值发送过去,用同一个执行计划执行1000遍,这样可以减少数据库生成执行计划带来的开销</p>
<pre><code>for(int i = 0; i &lt; 1000; i++){

    ps.setString(1, user);
    ps.executeUpdate();
}
</code></pre>

</li>
</ul>
<h3>2)void setString(int parameterIndex, String x)  设置?的值</h3>
<ul>
<li>
PreparedStatement 提供了多种重载的方法,根据需要选择
<ul>
<li>void setDouble(int parameterIndex, double x)   
</li>
<li>void setDate(int parameterIndex, Date x)</li>
</ul>
</li>
</ul>
<h2>2.事务控制</h2>
<ul>
<li>
<p>JDBC默认是自动提交事务的,即:每指定一条DML操作事务就会提交 .</p>
</li>
<li>
<p>事务是在Connection 中维护的,但实际上调用的还是数据库的事务机制.</p>
</li>
</ul>
<h3>2.1)void setAutoCommit(boolean autoCommit)  设置事务自动提交开关</h3>
<ul>
<li>默认是true,自动提交, 若希望控制事务,那么首先要将自动提交事务关闭,即设置为false</li>
</ul>
<h3>2.2)void commit() 提交事务</h3>
<h3>2.3)void rollback() 回滚事务</h3>
<ul>
<li>如果使用手动提交事务,在捕获异常中需要设置回滚事务</li>
<li>
<p>并且在使用完毕后在finally中关闭连接
		try{</p>
<pre><code>    } catch (Exception e) {
        e.printStackTrace();
        if(conn!=null){
            try {
                conn.rollback();      //设置回滚事务
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
    }finally{
        if(conn!=null){
            try {
                conn.setAutoCommit(true);  //使用完毕后,设置回默认状态
                conn.close();           //关闭连接
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
</code></pre>

<p>eg:完成转账操作</p>
</li>
</ul>
<h2>3.批处理</h2>
<ul>
<li>
<p>当需要一次执行多条SQL语句时,可以使用批操作.缓存一组SQL语句一次性发送至数据库执行,这样可以减少客户端到数据库之间的网络调用次数,提高SQL传输效率等</p>
</li>
<li>
<p>Statement 和 PreparedStatement 都可以使用批操作</p>
</li>
</ul>
<h3>3.1)void addBatch()   添加到批处理中</h3>
<h3>3.2)int[ ] executeBatch()  执行批处理</h3>
<h3>3.3)void clearBatch() 清空批处理</h3>
<ul>
<li>批量更新中，为了防止内存溢出，要及时清空语句列表</li>
</ul>
<h2>4.数据库连接池</h2>
<h3>4.1)创建对象:BasicDataSource ds = new BasicDataSource( )</h3>
<h3>4.2)void setDriverClassName(String driverName) 设置驱动jar包路径</h3>
<ul>
<li>同 Class.forName(String className)  用于加载类库驱动jar包</li>
</ul>
<h3>4.3)void setUrl(String url) 设置数据库地址</h3>
<ul>
<li>同 DriverManager.getConnection()</li>
<li>数据库地址(不同数据库格式不同):地址:端口:SID</li>
</ul>
<h3>4.4)void setUsername(String username) 设置用户名</h3>
<ul>
<li>登录数据库时的用户名</li>
</ul>
<h3>4.5)void setPassword(String password) 设置密码</h3>
<ul>
<li>登录数据库时的密码</li>
</ul>
<h3>4.6)void setMaxActive(int maxActive)    最大连接数</h3>
<h3>4.7)void setMaxWait(long maxWait)  最大等待时间</h3>
<h3>4.8)Connection getConnection() 获取连接</h3>
<ul>
<li>连接池提供了获取连接的方法Connection getConnection()</li>
<li>
<p>该方法会将连接池中的空闲连接反回,若当前连接池中没有可用空闲连接,那么该方法会阻塞,阻塞时间由maxWait指定的值决定.在阻塞期间若有空闲连接可用会立刻返回该连接,若超时后仍没有可用连接, 那么该方法会拋出超时异常 </p>
<pre><code>BasicDataSource ds = new BasicDataSource( ) 
Connection conn = ds.getConnection()        // 获取连接
</code></pre>

</li>
</ul>
<h1>JDBC-day03</h1>
<h2>1.返回自动主键</h2>
<ul>
<li>
<p>创建PS时指定第二个参数,该参数是一个字符串数组,数组中每个元素, 应当是一个字段名,标明通过PS执行DML操作后,返回该记录对应字段的值</p>
<pre><code>PreparedStatement ps = conn.prepareStatement(deptSql,new String[]{&quot;deptno&quot;});
</code></pre>

</li>
</ul>
<h3>1) ResultSet getGeneratedKeys() 获取字段的结果集</h3>
<pre><code>    ResultSet rs = dps.getGeneratedKeys();
</code></pre>

<h3>2) int getInt(int columnIndex);  获取指定字段的值</h3>
<pre><code>    ResultSet rs = dps.getGeneratedKeys();

    rs.next();  //指向结果集下一条记录

    //获取第一个字段的值  ,在参数内传入1
    int deptno = rs.getInt(1); 
</code></pre>

<h2>2.DAO数据访问对象</h2>
<ul>
<li>DAO是一个层次所有类的统称</li>
<li>DAO是夹在业务逻辑层与数据库之间的层次.作用是将对数据库的所有操作从业务逻辑层中抽离出来,使得业务逻辑层的代码只关注业务,不再关注数据的维护操作.而且DAO也可以让业务逻辑层的代码对数据的操作完全对象化</li>
</ul>

</body>
</html>
<!-- This document was created with MarkdownPad, the Markdown editor for Windows (http://markdownpad.com) -->
